package com.bw.image.util

import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import com.bumptech.glide.load.engine.Resource
import java.io.ByteArrayOutputStream

/**
 *
 * 压缩方式：大小，质量，缩放，编码格式，矩阵，采样压缩
 * */
object BitmapUtil {

    /**
     * 质量压缩
     * */

    fun compressQuality(resources: Resources, resId:Int, quality:Int):Bitmap{
        //从资源文件中解析图片
        var bm=BitmapFactory.decodeResource(resources,resId)
        var bmos =ByteArrayOutputStream()
        bm.compress(Bitmap.CompressFormat.JPEG,100,bmos)
        var newBitmap=BitmapFactory.decodeByteArray(bmos.toByteArray(),quality,bmos.toByteArray().size)
        //回收资源
        bm.recycle()
        bmos.close()
        return newBitmap
    }

    /**
     * 矩阵压缩  圆形变矩形 (2种形式) 圆内  圆外
     * */
    fun compressMatrixBitmap(resources: Resources,resId: Int,sx:Float,sy:Float):Bitmap{
        var bitmapMatrix=Matrix ().apply {
            setScale(sx,sy)
        }
        //加载资源图片
        var bm =BitmapFactory.decodeResource(resources,resId)

        val newBitmap=Bitmap.createBitmap(bm,0,0,bm.width,bm.height,bitmapMatrix,true)
        bm.recycle()
        return newBitmap
    }

    /**
    *  编码格式压缩
     *  计算图片占内存大小：宽*高*每像素所占字节数  (1个字节占8位)
     *  ARGB_8888 占4字节 32位
     *  RGB_565 占2字节 16位
     *  ARGB_4444 占2字节 16位
     *  ALPHA_8 占1字节 8位
     *  RGBA_F16 占8字节 64位
    * */
    fun compressEncodeFormatBitmap(resources: Resources,resId: Int,config:Bitmap.Config=Bitmap.Config.RGB_565):Bitmap{
        var options = BitmapFactory.Options().apply {
            inPreferredConfig = config
        }

        return BitmapFactory.decodeResource(resources,resId,options)
    }

    /**
     * 缩放压缩
     * */

    fun compressScaleBitmap(resources: Resources,resId: Int,dstW:Int,dstH:Int):Bitmap{
        var bm =BitmapFactory.decodeResource(resources,resId)

        var newBitmap = Bitmap.createScaledBitmap(bm,dstW,dstH,true)

        bm.recycle()
        return newBitmap
    }


    /**
    * 二次采样压缩(像素点会变少，像素会变模糊)
    * */

    fun compressSampleSizeBitmap(resources: Resources,resId: Int,maxW:Int,maxH:Int):Bitmap{
        var sampleSize = 1//默认为1

        var options=BitmapFactory.Options().apply {
            inJustDecodeBounds=true//只加载图片大小 不加载图片像素
        }
        //第一次加载获取图片宽高
       var bm= BitmapFactory.decodeResource(resources,resId,options)

        //获取图片宽高
        var bmW = options.outWidth
        var bmH = options.outHeight

        while(bmW>maxW || bmH>maxH){
            sampleSize *= 2//采样率 大小增加2倍

            //重新计算图片宽高
            bmW /= sampleSize
            bmH /= sampleSize
        }

        //加载图片像素
        options.inJustDecodeBounds=false
        options.inSampleSize =sampleSize
        bm.recycle()

        var newBitmap = BitmapFactory.decodeResource(resources,resId,options)
        return newBitmap
    }
}